// IO 函子的问题    嵌套函子的复杂性 不利于理解以及操作
const fs = require('fs')
const fp = require('lodash/fp')

class IO {
    static of (value) {
        return new IO(function() {
            return value
        })
    }

    constructor (fn) {
        this._value = fn;
    }

    map (fn) {
        return new IO(fp.flowRight(fn, this._value))
    }
}

//读取文件内容并打印该内容
//读取文件函数
let readFile = function (filename) {
    return new IO(function () {
        return fs.readFileSync(filename, 'utf-8')
    })
}

//接收打印的内容  此处的print仅用来演示IO函子嵌套
let print = function (x) {
    return new IO(function () {
        console.log(x);             //打印结果  IO { _value: [Function] }
        return x
    })
}

let cat = fp.flowRight(print, readFile);
//IO(IO(x)) 最外边的IO是print返回的IO函子 里边的IO是readFile返回的IO函子

//返回的是函子，并没有真正读取文件 延迟执行了
//第一个_value执行的是print返回的IO内的函数  第二个_value执行的是readFile返回函子中的函数
let r = cat('package.json')._value()._value()     
console.log(r);             // 打印结果: 文件内容

// let s = readFile('package.json')._value()
// console.log(s);             //打印结果： 文件内容

// IO(function () {
//     console.log(x);
//     return IO(function() {
//         return fs.readFileSync
//     })
// })

